<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // let obj = {
        //     a:12
        // }

        // function fn(a){
        //     console.log(this);
        //     console.log(a);
        // }

        // fn.call(obj,6);  // obj, 6

        // fn.apply(obj,[12]); //obj,12

        // fn.bind(obj)(888) //obj,888




        // let obj = {
        //     b:5
        // }

        // let fn = (n)=>{
        //     console.log(this);
        //     console.log(n);
        // }

        // fn.call(obj,10); //window ,10

        // fn.apply(obj,[9]); //window,9

        // fn.bind(obj)(777) //window,777




        // 总结箭头函数：

        // 1. 语法：
        // let fn = (a,b,c)=>{
        //     console.log(a+b+c);
        // }

        // fn(1,2,3);

        // 简写规则：
        // 1. 只有一个参数的时候 ，可以不写小括号
        // 2. 函数内只有一句话的时候，可以不写花括号

        // let fn = n => console.log(n);

        // fn(123);

        // 3. 如果函数内只有返回值，并且一行代码，就不用写return

        // let fn = n => n+1;
        // console.log(fn(6));


        // 4. 如果你返回的数据是一个对象，就要用()把对象包起来
        // let fn = n => ({a:12,b:5})

        // console.log(fn());


        // 1. this ， 箭头函数内没有自己的this。 都是它外层的this

        console.log(this); //window
        let obj = {
            fn:function(){
                console.log(this);
            },
            fn2:()=>{
                console.log("箭头",this);
            },
            fn3:function(){
                console.log("fn3",this); //obj
                let subFn = ()=>{
                    console.log('subFn',this);
                }

                subFn()
            }
        }

        // obj.fn(); //obj

        // obj.fn2() //window


        // 箭头函数无法使用call、apply、bind改变this
        // obj.fn2.call('123')


        // obj.fn3()

        // 构造函数
        // let fn = ()=>{

        // }

        // fn is not a constructor
        // new fn();

        // 没有arguments属性
        // let fn = ()=>{
        //     //Uncaught ReferenceError: arguments is not defined
        //     console.log(arguments);
        // }

        // fn(123,456)


        let fn = (...arg)=>{
            console.log(arg);
        }

        fn(123,456)





    </script>
</body>
</html>